大學升三年級時,剛放暑假卻接到一通電話,找我去幫忙寫程式,有同學的期末專題刻不出來,找我去救火。那一回,要開發的專案要求是:「把記憶體中的樹狀資料結構,存到硬碟裡,之後,程式要再設法讀取硬碟,把資料讀進記憶體裡並且重建樹狀資料結構。」
記憶之中,我的寫法非常地暴力,就是開啟一個檔案,然後定下一些規則,比方說:
寫的時候,就是開啟檔案,一列一列地寫進檔案裡。讀的時候,自然也是一列一列地讀進記憶體。如果要查詢的話,一定要先讀進記憶體才有辦法查詢。
在 Joe Celko 的 SQL for Smarties 書裡,有講過一些早期程式設計師的故事。曾經有一個年代的程式設計師是有鐵飯碗的,又稱之為 job security programming,因為他們寫的程式,都有獨特的檔案讀寫規則。如果把他們開除了,這些檔案日後都將無法讀取。
當年那個既難寫又難維護的設計,基本上就跟 Joe Celko 所講的 job security programming 差不多。因為寫程式的人都不知道應該要使用 SQL 。(不過,前輩們是因為出生在 SQL 發明之前,而我是因為書念得太少。)
沒有利用 SQL/RDBMS 來儲存資料,而直接寫入檔案的話,程式碼與資料很容易緊密地耦合 (couple) 在一起,這會讓程式非常難以維護。
SQL 的初學者可能會覺得,資料表與檔案也差不多吧?不,真的差很多。在 SQL for smarties 一書的開頭,Joe Celko 就先強調了幾個重點:
對上述五點做解釋,已經超過本系列文的範疇。這邊直接跳到 Joe Celko 的結論:「什麼是 SQL 的運作模型 (working model) 呢?」
資料是存放在抽象的集合 (abstract set) 裡,而非實體的檔案裡。而此處的集合 (set),就是數學課裡談過的集合。換言之,SQL 是一種運作在集合上的語言。
光是要談清楚 SQL/RDMBS 就可以用幾本書的篇幅來談,另一方面,如果只是資料分析所需要學會的 SQL ,也可以不用到那麼高的標準。快速上手 SQL ,可以考慮用以下的順序來學:
這邊有四種最基礎的 SQL 語法,學會了,就可以擷取資料庫裡任意位置的資料了。
SELECT * FROM $table1
SELECT column1, column2, ... FROM $table1
SELECT * FROM $table1 AS t1 JOIN $table2 AS t2 ON t1.id = t2.id
SELECT * FROM $table1 WHERE condition
這邊推荐一個 UI 設計看起來很舊的 SQL 學習網站 1KeyData 。UI 看起來是舊了一些,但是內容的編排歷久彌新,大約就是涵蓋 SQL-92。
如果喜歡透過寫練習題來學習的讀者,也可以考慮像 SQLZoo 的互動式教學練習網站。
初學者一開始可能覺得「咦,這個有什麼意義嗎?」
有一天當你寫 SQL Query ,總是百思不得其解,為何這樣行、那樣又不行時,就是回來研究清楚 SQL 語句的執行順序的時刻了。